#include <iostream>
#include <boost/thread/thread.hpp>
#include "Trace.h"

using namespace tsc::common;
using namespace std;

void TraceTest1()
{
  ENTER("T1:TraceTest1");

  INFO("T1:[TEST TRACE 1 BEGIN]");
  INFO(STR("T1:This is a test for STR() with no additional arguments."));
  INFO(STR("T1:This is a test for STR() with %%s=%s, 0x%%08X=0x%08X", "string", 0x00FFEEDD));
  INFO(STR("T1:This is a test for STR() using the whole static buffer.....\n"\
"0000000000000000000000000000000000000000000000000000000000000000000000000000000\n"
"1111111111111111111111111111111111111111111111111111111111111111111111111111111\n"
"2222222222222222222222222222222222222222222222222222222222222222222222222222222\n"
"3333333333333333333333333333333333333333333333333333333333333333333333333333333\n"
"4444444444444444444444444444444444444444444444444444444444444444444444444444444\n"
"5555555555555555555555555555555555555555555555555555555555555555555555555555555\n"
"6666666666666666666666666666666666666666666666666666666666666666666666666666666\n"
"7777777777777777777777777777777777777777777777777777777777777777777777777777777\n"
"8888888888888888888888888888888888888888888888888888888888888888888888888888888\n"
"9999999999999999999999999999999999999999999999999999999999999999999999999999999\n"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"));
 INFO("T1:Next test will overrun the trace buffer");
 INFO(STR("T1:This is a test for STR() using the whole static buffer.........\n"\
"0000000000000000000000000000000000000000000000000000000000000000000000000000000\n"
"1111111111111111111111111111111111111111111111111111111111111111111111111111111\n"
"2222222222222222222222222222222222222222222222222222222222222222222222222222222\n"
"3333333333333333333333333333333333333333333333333333333333333333333333333333333\n"
"4444444444444444444444444444444444444444444444444444444444444444444444444444444\n"
"5555555555555555555555555555555555555555555555555555555555555555555555555555555\n"
"6666666666666666666666666666666666666666666666666666666666666666666666666666666\n"
"7777777777777777777777777777777777777777777777777777777777777777777777777777777\n"
"8888888888888888888888888888888888888888888888888888888888888888888888888888888\n"
"9999999999999999999999999999999999999999999999999999999999999999999999999999999\n"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"));
 INFO("T1:[TEST TRACE 1 END]");

 RETURN;
}

void TraceTest2()
{
  ENTER("T2:TraceTest2");

  INFO("T2:[TEST TRACE 2 BEGIN]");
  INFO("T2:Test of INFO()");
  INFO(STR("T2:Test of INFO() value %u", 0xFF));
  INFO("T2:[ENTER trace disabled]");

  INFO("T2:[ENTER trace enabled]");
  ENTER("T2:TraceTest2");

  INFO("T2:[ENABLE_ALL_TRACE]");
  ENABLE_ALL_TRACE();
  INFO("T2:This is INFO.");
  ENTER("T2:This is ENTER.");
  STATE_CHANGE("T2:This is STATE_CHANGE.");
  TRACE_PARAM("T2:This is TRACE_PARAM.");
  TRACE_ERROR("T2:This is TRACE_ERROR.");
  TRACE(1, "T2:This is TRACE1.");
  TRACE(2, "T2:This is TRACE2.");
  TRACE(3, "T2:This is TRACE3.");
  TRACE(4, "T2:This is TRACE4.");
  TRACE(5, "T2:This is TRACE5.");
  TRACE(6, "T2:This is TRACE6.");
  TRACE(7, "T2:This is TRACE7.");
  TRACE(8, "T2:This is TRACE8.");
  TRACE(9, "T2:This is TRACE9.");

  char buff[512];
  size_t buffSize = sizeof(buff);
  for(unsigned int i=0; i<buffSize; ++i)
  {
    buff[i]= (i < 256) ? i : 255-i;
  }
  const char* cBuff = buff;

  TRACE_BUS_SEND(cBuff, buffSize, "T2:This is TRACE_BUS_SEND.");
  TRACE_BUS_RECEIVE(cBuff, buffSize+1, "T2:This is TRACE_BUS_RECEIVE.");

  INFO("T2:[TEST TRACE 2 END]");

  RETURN;
}

int main(int argc, char* argv[])
{
  TRACE_PROCESS("tsc_test");
  ENABLE_TRACE(ENTER);
  ENABLE_TRACE(RETURN);

  TraceTest1();
  TraceTest2();

  boost::thread_group tTreads;
  tTreads.create_thread(&TraceTest1);
  tTreads.create_thread(&TraceTest2);
  tTreads.join_all();

  return 0;

}
